tg-me.com/BookPython/3616
Last Update:
Python предоставляет мощную библиотеку для работы с датой и временем — datetime
. Интересный момент: объекты datetime
имеют специальный интерфейс для поддержки часовых поясов (атрибут tzinfo), однако сама библиотека `datetime
реализует его лишь частично, оставляя остальную работу сторонним модулям.
Самым популярным модулем для этой задачи является pytz
. Хитрость в том, что pytz
не полностью соответствует интерфейсу tzinfo
. В документации pytz
прямо указано с самого начала: «Эта библиотека отличается от задокументированного API Python для реализаций tzinfo
».
Вы не можете просто передать объект временной зоны pytz
в атрибут tzinfo
. Если попробуете, результат может быть абсолютно безумным:
In : paris = pytz.timezone('Europe/Paris')
In : str(datetime(2017, 1, 1, tzinfo=paris))
Out: '2017-01-01 00:00:00+00:09'
Посмотрите на этот смещение
+00:09
. Правильное использование pytz
выглядит так:
In : str(paris.localize(datetime(2017, 1, 1)))
Out: '2017-01-01 00:00:00+01:00'
Кроме того, после любых операций с датой и временем, нужно нормализовать объект
datetime
, если есть вероятность смены смещения (например, на границе перехода на летнее время):
In : new_time = time + timedelta(days=2)
In : str(new_time)
Out: '2018-03-27 00:00:00+01:00'
In : str(paris.normalize(new_time))
Out: '2018-03-27 01:00:00+02:00'
Начиная с Python 3.6, рекомендуется использовать
dateutil.tz
вместо pytz
. Он полностью совместим с tzinfo
, может использоваться напрямую, не требует normalize
, хотя и работает немного медленнее.Если вам интересно, почему
pytz
не поддерживает API datetime
, или вы хотите увидеть больше примеров, обязательно почитайте хорошую статью на эту тему.👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3616